home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 4
/
Aminet 4 - November 1994.iso
/
aminet
/
comm
/
term
/
xprkermit_2.lha
/
ckxfio.c
next >
Wrap
C/C++ Source or Header
|
1993-03-31
|
15KB
|
633 lines
/*
* CKXFIO.C
*
* File I/O routines for XPR C Kermit.
*
*/
char *ckzv = "Amiga XPR file support, 5A(001), 6 August 1992";
#include "ckcdeb.h"
#include "ckcker.h"
#include "ckxker.h"
char *DELCMD = "delete ";
char *DIRCMD = "list ";
char *DIRCM2 = "list ";
char *PWDCMD = "cd ";
char *SPACMD = "info ";
char *SPACM2 = "info ";
char *TYPCMD = "type ";
char *WHOCMD = "status ";
int backgrd = 1;
int ckxech = 0;
char *ckxsys = "Amiga External Protocol";
char *ckzsys = " Amiga XPR";
int maxnam = 128;
int maxpath = 128;
int success = 1;
int fdispla = XYFD_C; /* We always do screen displays */
char optbuf[100]; /* Option buffer for MAIL or PRINT */
/* Declarations */
long fp[ZNFILS] = { /* File pointers */
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L };
/* (PWP) external def. of things used in buffered file input and output */
#ifdef DYNAMIC
extern CHAR *zinbuffer, *zoutbuffer;
#else
extern CHAR zinbuffer[], zoutbuffer[];
#endif /* DYNAMIC */
extern CHAR *zinptr, *zoutptr;
extern int zincnt, zoutcnt;
extern long (*xupdate) (), (*xswrite) (), (*xfopen) (), (*xfclose) (),
(*xfread) (), (*xsread) (), (*xchkabort) (), (*xfnext) (), (*xffirst) (),
(*xsflush) (), (*xfwrite) (), (*xgets) (), (*xfinfo) (), (*xunlink)() ,
(*xsquery) (), (*xchkmisc) ();
/* C H K F N -- Internal function to verify file number is ok */
/*
Returns:
-1: File number n is out of range
0: n is in range, but file is not open
1: n in range and file is open
*/
int
chkfn(int n) {
switch (n) {
case ZIFILE:
case ZOFILE:
case ZDFILE:
case ZTFILE:
case ZPFILE:
case ZSFILE:
case ZRFILE:
case ZWFILE: break;
default:
debug(F101,"chkfn: file number out of range","",n);
return(-1);
}
return( (fp[n] == 0L) ? 0 : 1 );
}
int
iswild(char *filespec) {
if (strchr(filespec, '?') >= 0)
return(1);
else
return(0);
}
#ifndef MAXPATHLEN
#define MAXPATHLEN 256
#endif
static char zcurrent[MAXPATHLEN] = "";
int
zchdir(char *dirnam) {
strncpy(zcurrent, dirnam, MAXPATHLEN - 1);
return 1;
}
/* Z C H K I -- Check if input file exists and is readable */
/*
Returns:
>= 0 if the file can be read (returns the size).
-1 if file doesn't exist or can't be accessed,
-2 if file exists but is not readable (e.g. a directory file).
-3 if file exists but protected against read access.
*/
static long iflen;
static long iftype;
long
zchki(char *fn) {
iflen = callad(xfinfo, fn, 1L);
if (iflen <= 0)
return(-1);
else {
iftype = callad(xfinfo, fn, 2L);
return iflen;
}
}
/* Z C H K O -- Check if output file can be created */
/*
Returns -1 if write permission for the file would be denied, 0 otherwise.
Since we can't really do this from XPR Kermit, always return zero and
let the zopeno() call fail.
*/
int
zchko(char *fn) {
return 0;
}
/* Z C H K S P A -- Check to see if there is enough space for the file. */
int
zchkspa(char *f, long len) {
return 1;
}
/* Z C H I N -- Get a character from the input file. */
/* Returns -1 if EOF, 0 otherwise with character returned in argument */
int
zchin(int n, int *c) {
int a, x;
/* (PWP) Just in case this gets called when it shoudn't */
if (n == ZIFILE) {
x = zminchar();
*c = x;
return (x);
}
if (calladda(xfread, &a, sizeof(char), 1, fp[n]) != 1) return(-1);
*c = (CHAR) a & 0377;
return(0);
}
/* Z C H O U T -- Add a character to the given file. */
/* Should return 0 or greater on success, -1 on failure (e.g. disk full) */
int
zchout(int n, char c) {
if (chkfn(n) < 1) return(-1);
if (calladda(xfwrite, &c, sizeof(char), 1, fp[n]) != 1)
return(-1);
else /* Otherwise... */
return(0); /* There was no error. */
}
/* Z C L O S E -- Close the given file. */
/* Returns 0 if arg out of range, 1 if successful, -1 if close failed. */
int
zclose(int n) {
int x, x2;
if (chkfn(n) < 1) return(0); /* Check range of n */
if ((n == ZOFILE) && (zoutcnt > 0)) /* (PWP) output leftovers */
x2 = zoutdump();
else
x2 = 0;
x = calla(xfclose, fp[n]);
iflen = -1; /* Invalidate file length */
fp[n] = NULL; /* And file pointer */
if (x < 0) /* if we got a close error */
return (-1);
else if (x2 < 0) /* or an error flushing the last buffer */
return (-1); /* then return an error */
else
return (1);
}
/* Z D E L E T -- Delete the named file. */
int
zdelet(char *fn) {
if (xunlink != NULL) {
if (calla(xunlink, fn) < 0)
return -1;
}
return 0;
}
/* Z G T D I R --- Return pointer to name of current directory */
char *
zgtdir(void) {
return NULL;
}
/* Z H O M E --- Return pointer to user's home directory */
/* we return "S:", which is where startup scripts are found */
char *
zhome(void) {
return("S:"); /* approximately */
}
/*
* (PWP) (re)fill the buffered input buffer with data. All file input
* should go through this routine, usually by calling the zminchar()
* macro (in ckcker.h).
*/
int
zinfill(void) {
zincnt = calladda(xfread, zinbuffer, sizeof (char), INBUFSIZE, fp[ZIFILE]);
debug(F101,"zinfill zincnt","",zincnt);
if (zincnt == 0) return (-1); /* end of file */
zinptr = zinbuffer; /* set pointer to beginning, (== &zinbuffer[0]) */
zincnt--; /* one less char in buffer */
return((int)(*zinptr++) & 0377); /* because we return the first */
}
int
zkself(void) {
return -1;
}
/* Z S T R I P -- Strip device & directory name from file specification */
/* Strip pathname from filename "name", return pointer to result in name2 */
static char work[256]; /* buffer for use by zstrip and zltor and others */
void
zstrip(char *name, char **name2) {
char *cp, *pp;
debug(F110,"zstrip before",name,0);
pp = work;
if ((cp = strrchr(name, ':')) == NULL)
cp = name;
else
++cp;
for (; *cp != '\0'; cp++) {
if (*cp == '/')
pp = work;
else
*pp++ = *cp;
}
*pp = '\0'; /* Terminate the string */
*name2 = work;
debug(F110,"zstrip after",*name2,0);
}
/* Z L T O R -- Local TO Remote */
/* Convert filename from local format to common (remote) form. */
void
zltor(char *name, char *name2) {
char *cp, *pp;
int dc = 0;
debug(F110,"zltor",name,0);
pp = work;
if ((cp = strrchr(name, ':')) == NULL)
cp = name;
else
++cp;
for (; *cp != '\0'; cp++) { /* strip path name */
if (*cp == '/') {
dc = 0;
pp = work;
}
else if (islower(*cp)) *pp++ = toupper(*cp); /* Uppercase letters */
else if (*cp == '~') *pp++ = 'X'; /* Change tilde to 'X' */
else if (*cp == '#') *pp++ = 'X'; /* Change number sign to 'X' */
else if ((*cp == '.') && (++dc > 1)) *pp++ = 'X'; /* & extra dots */
else *pp++ = *cp;
}
*pp = '\0'; /* Tie it off. */
cp = name2; /* If nothing before dot, */
if (*work == '.') *cp++ = 'X'; /* insert 'X' */
strcpy(cp,work);
debug(F110," name2",name2,0);
}
/* Z M A I L --- Send file as mail to user */
/* Not implementable on a personal computer. */
int
zmail(char *addr, char *fn) {
return -2;
}
/* Z N E W N -- Make a new name for the given file */
void
znewn(char *fn,char **s) {
static char buf[100];
char *bp;
int len = 0, d;
#ifdef MAXNAMLEN
int maxlen = MAXNAMLEN;
#else
int maxlen = 14;
#endif
bp = buf;
while (*fn) { /* Copy name into buf */
*bp++ = *fn++;
len++;
}
if (len > maxlen-3) bp -= 3; /* Don't let it get too long */
/*
* On the Amiga, it takes much less time to determine
* if a given file exists than to read all the file names in
* a directory (or even just names with a certain prefix).
*/
d = 0;
do {
sprintf(bp, "~%d", ++d);
} while (zchki(buf) != -1 && d < 100);
*s = buf;
}
/* Z X P A N D --- Expand wild card file name list */
#define MAXWLD 300
static char *mtchs[MAXWLD], /* Matches found for filename */
**mtchptr; /* Pointer to current match */
static int fcount; /* Number of matches */
#define SSPACE 4000
static char sspace[SSPACE]; /* buffer to generate names in */
int
zxpand(char *fn) {
char *sptr = sspace;
long state;
if ((state = callaa(xffirst, work, fn)) == 0)
return 0;
if (strlen(work) >= SSPACE) /* Unlikely */
return -1;
strcpy(sptr, work);
mtchs[0] = sptr;
mtchptr = mtchs;
fcount = 1;
sptr += (strlen(sptr) + 1);
while ((state = calldaa(xfnext, state, work, fn)) != 0) {
if (sptr - sspace + strlen(work) >= SSPACE)
return -1;
strcpy(sptr, work);
mtchs[fcount++] = sptr;
sptr += (strlen(sptr) + 1);
}
return(fcount);
}
/* Z N E X T -- Get name of next file from list created by zxpand(). */
/*
Returns >0 if there's another file, with its name copied into the arg string,
or 0 if no more files in list.
*/
int
znext(char *fn) {
if (fcount-- > 0)
strcpy(fn,*mtchptr++);
else
*fn = '\0';
debug(F111,"znext",fn,fcount+1);
return(fcount+1);
}
/* Z O P E N I -- Open an existing file for input. */
int
zopeni(int n, char *fn) {
if (chkfn(n) != 0)
return 0;
fp[n] = callaa(xfopen, fn, "r"); /* Real file. */
debug(F111," zopeni", name, (int) fp[n]);
return((fp[n] != 0L) ? 1 : 0);
}
/* Z O P E N O -- Open a new file for output. */
int
zopeno(int n, char *name, struct zattr *zz, struct filinfo *fcb) {
char *p; /* Local use pointer */
if (fcb) {
debug(F101,"zopeno fcb disp","",fcb->dsp);
debug(F101,"zopeno fcb type","",fcb->typ);
debug(F101,"zopeno fcb char","",fcb->cs);
} else {
debug(F100,"zopeno fcb is NULL","",0);
}
if (n != ZDFILE)
debug(F111," zopeno",name,n);
if (chkfn(n) != 0) return(0);
p = "w"; /* Assume write/create mode */
if (fcb) { /* If called with an FCB... */
if (fcb->dsp == XYFZ_A) /* Does it say Append? */
p = "a"; /* Yes. */
}
fp[n] = callaa(xfopen, name, p); /* Open the file */
if (fp[n] == 0L)
perror("zopeno can't open");
zoutcnt = 0; /* (PWP) reset output buffer */
zoutptr = zoutbuffer;
if (n != ZDFILE)
debug(F101, " fp[n]", "", (int) fp[n]);
return((fp[n] != 0L) ? 1 : 0);
}
/* (PWP) buffered character output routine to speed up file IO */
int
zoutdump(void) {
int x;
zoutptr = zoutbuffer; /* reset buffer pointer in all cases */
debug(F101,"zoutdump chars","",zoutcnt);
if (zoutcnt == 0) { /* nothing to output */
return(0);
} else if (zoutcnt < 0) { /* unexpected negative value */
zoutcnt = 0; /* reset output buffer count */
return(-1); /* and fail. */
}
if (x = calladda(xfwrite, zoutbuffer, 1, zoutcnt, fp[ZOFILE])) {
debug(F101,"zoutdump fwrite wrote","",x);
zoutcnt = 0; /* reset output buffer count */
return(0); /* things worked OK */
} else {
zoutcnt = 0; /* reset output buffer count */
debug(F101,"zoutdump fwrite error","",x);
return(x ? -1 : 0); /* return failure if error */
}
}
int
zprint(char *p, char *f) {
return 0;
}
int
zrename(char *fn, char *fn2) {
return 0;
}
/* Z R T O L -- Convert remote filename into local form */
/* For AMIGA, this means changing uppercase letters to lowercase. */
void
zrtol(char *name, char *name2) {
for ( ; *name != '\0'; name++) {
*name2++ = isupper(*name) ? tolower(*name) : *name;
}
*name2 = '\0';
debug(F110,"zrtol:",name2,0);
}
int
zsattr(struct zattr *xx) {
long k;
k = iflen % 1024L; /* File length in K */
if (k != 0L) k = 1L;
xx->lengthk = (iflen / 1024L) + k;
if (iftype == 1L)
xx->type.val = "text";
else
xx->type.val = "binary";
xx->type.len = strlen(xx->type.val);
xx->date.len = 0;
xx->date.val = "";
xx->creator.len = 0; /* File creator */
xx->creator.val = "";
xx->account.len = 0; /* File account */
xx->account.val = "";
xx->area.len = 0; /* File area */
xx->area.val = "";
xx->passwd.len = 0; /* Area password */
xx->passwd.val = "";
xx->blksize = -1L; /* File blocksize */
xx->access.len = 0; /* File access */
xx->access.val = "";
xx->encoding.len = 0; /* Transfer syntax */
xx->encoding.val = 0;
xx->disp.len = 0; /* Disposition upon arrival */
xx->disp.val = "";
xx->lprotect.len = 0; /* Local protection */
xx->lprotect.val = "";
xx->gprotect.len = 0; /* Generic protection */
xx->gprotect.val = "";
xx->systemid.len = 2; /* System ID length */
xx->systemid.val = "L3"; /* Amiga system ID code */
xx->recfm.len = 0; /* Record format */
xx->recfm.val = "";
xx->sysparam.len = 0; /* System-dependent parameters */
xx->sysparam.val = "";
xx->length = iflen; /* Length */
return(0);
}
int
zshcmd(char *s) {
return -1;
}
int
zsyscmd(char *s) {
return -1;
}
/* Z S I N L -- Read a line from a file */
/*
Writes the line into the address provided by the caller.
n is the Kermit "channel number".
Writing terminates when newline is encountered, newline is not copied.
Writing also terminates upon EOF or if length x is exhausted.
Returns 0 on success, -1 on EOF or error.
*/
int
zsinl(int n, char *s, int x) {
int z = 0, a;
if (chkfn(n) < 1) { /* Make sure file is open */
return(-1);
}
while (x--) {
if (zchin(n,&a) < 0) { /* Read a character from the file */
z = -1;
break;
}
if (a == '\n') break;
*s = a;
s++;
}
*s = '\0';
return(z);
}
/* Z S O U T -- Write a string to the given file, buffered. */
int
zsout(int n, char *s) {
if (chkfn(n) < 1) return(-1);
if (strlen(s) == 0)
return 0;
if (calladda(xfwrite, s, sizeof(char), strlen(s), fp[n]) <= 0)
return -1;
return(strlen(s));
}
/* Z S O U T L -- Write string to file, with line terminator, buffered */
int
zsoutl(int n, char *s) {
if (chkfn(n) < 1) return(-1);
if (strlen(s) > 0)
if (calladda(xfwrite, s, sizeof(char), strlen(s), fp[n]) <= 0)
return -1;
if (calladda(xfwrite, "\n", sizeof(char), 1, fp[n]) <= 0)
return -1;;
return(0);
}
int
zsoutx(int n, char *s, int x) {
if (x > 0)
if (calladda(xfwrite, s, sizeof(char), x, fp[n]) != x)
return -1;
return x;
}
int
zstime(char *f, struct zattr *yy, int x) {
return 0;
}
int
zxcmd(int n, char *s) {
return 0;
}
int
xsystem(char *cmd) {
return -1;
}
int
priv_ini(void) {
return 0;
}
int
priv_on(void) {
return 0;
}
int
priv_off(void) {
return 0;
}
int
priv_can(void) {
return 0;
}
int
priv_chk(void) {
return 0;
}